package com.scs.application.modules.order.service;

import com.scs.application.core.exceptions.BusinessException;
import com.scs.application.modules.order.entity.Delivery;
import com.scs.application.modules.order.entity.PurchaseOrder;

/**
 * 发货接口
 * @description:
 *   通过发货接口，将发货的各个环节封装成一个个独立的函数；
 *   当然，大部分情况下我们这些发货步骤都是必须的；少数情况下可能会有差异化。
 *
 */
public interface IDeliverySteps {

    /**
     * 发货验证
     *
     * @param d
     * @param po
     * @throws BusinessException  验证不通过就会返回异常
     */
    void validation(Delivery d, PurchaseOrder po) throws BusinessException;

    /**
     * 编辑：
     *      采购明细 已发数量
     *      发货单明细 已发数量、注册证号
     * @throws BusinessException
     */
    boolean doDeliver() throws BusinessException;

    /**
     * 完全发货完成
     */
    void fullDeliver();

    /**
     * 部分发货
     */
    void partDeliver();

    /**
     * 更新采购通知单状态
     * @param po
     */
    PurchaseOrder updateStatusPurchaseOrder(PurchaseOrder po);

    /**
     * 更新发货单状态
     * @param d
     */
    Delivery updateStatusDelivery(Delivery d);

    /**
     * 添加到订单业务进程表
     */
    void savePurchaseProcess();
}

